#include "nuklear.h"
#include "nuklear_internal.h"

/* ===============================================================
 *
 *                              TOOLTIP
 *
 * ===============================================================*/
NK_API nk_bool
nk_tooltip_begin(nk_context* ctx, float width) {
  int x, y, w, h;
  nk_window* win;
  const nk_input* in;
  nk_rect bounds;
  int ret;

  NK_ASSERT(ctx);
  NK_ASSERT(ctx->current);
  NK_ASSERT(ctx->current->layout);
  if (!ctx || !ctx->current || !ctx->current->layout)
    return 0;

  /* make sure that no nonblocking popup is currently active */
  win = ctx->current;
  in = &ctx->input;
  if (win->popup.win && (win->popup.type & NK_PANEL_SET_NONBLOCK))
    return 0;

  w = nk_iceilf(width);
  h = nk_iceilf(nk_null_rect.h);
  x = nk_ifloorf(in->mouse.pos.x + 1) - (int)win->layout->clip.x;
  y = nk_ifloorf(in->mouse.pos.y + 1) - (int)win->layout->clip.y;

  bounds.x = (float)x;
  bounds.y = (float)y;
  bounds.w = (float)w;
  bounds.h = (float)h;

  ret = nk_popup_begin(ctx, NK_POPUP_DYNAMIC, "__##Tooltip##__", NK_WINDOW_NO_SCROLLBAR | NK_WINDOW_BORDER, bounds);
  if (ret)
    win->layout->flags &= ~(nk_flags)NK_WINDOW_ROM;
  win->popup.type = NK_PANEL_TOOLTIP;
  ctx->current->layout->type = NK_PANEL_TOOLTIP;
  return ret;
}

NK_API void nk_tooltip_end(nk_context* ctx) {
  NK_ASSERT(ctx);
  NK_ASSERT(ctx->current);
  if (!ctx || !ctx->current)
    return;
  ctx->current->seq--;
  nk_popup_close(ctx);
  nk_popup_end(ctx);
}
NK_API void nk_tooltip(nk_context* ctx, const char* text) {
  const nk_style* style;
  nk_vec2 padding;

  int text_len;
  float text_width;
  float text_height;

  NK_ASSERT(ctx);
  NK_ASSERT(ctx->current);
  NK_ASSERT(ctx->current->layout);
  NK_ASSERT(text);
  if (!ctx || !ctx->current || !ctx->current->layout || !text)
    return;

  /* fetch configuration data */
  style = &ctx->style;
  padding = style->window.padding;

  /* calculate size of the text and tooltip */
  text_len = nk_strlen(text);
  text_width = style->font->width(style->font->userdata,
                                  style->font->height,
                                  text,
                                  text_len);
  text_width += (4 * padding.x);
  text_height = (style->font->height + 2 * padding.y);

  /* execute tooltip and fill with text */
  if (nk_tooltip_begin(ctx, (float)text_width)) {
    nk_layout_row_dynamic(ctx, (float)text_height, 1);
    nk_text_widget(ctx, text, text_len, NK_TEXT_LEFT);
    nk_tooltip_end(ctx);
  }
}
#ifdef NK_INCLUDE_STANDARD_VARARGS
NK_API void nk_tooltipf(nk_context* ctx, const char* fmt, ...) {
  va_list args;
  va_start(args, fmt);
  nk_tooltipfv(ctx, fmt, args);
  va_end(args);
}
NK_API void nk_tooltipfv(nk_context* ctx, const char* fmt, va_list args) {
  char buf[256];
  nk_strfmt(buf, NK_LEN(buf), fmt, args);
  nk_tooltip(ctx, buf);
}
#endif
